import {
  observe
} from './observer/index';


function initState(vm) {
  var options = vm.$options;

  //排除用户没有写data对象属性的情况
  if (options.data) {
    initData(vm);
  }
}

function initData(vm) {
  var data = vm.$options.data;

  //为了方便用户写法： this.data/ vm.data 对data进行getter/setter
  //vm._data vm挂载的临时data
  //返回一个改变this指向的data对象或者是一个空的对象
  data = vm._data = typeof data === 'function' ? data.call(vm) : data || {};

  for (var key in data) {
    // console.log(key);
    // name/age/info/hobby
    proxyData(vm, '_data', key);
  }

  //观察data 且观察data内部的东西
  observe(vm._data);
}

//ES5写法的代理
//代理数据
//实现 访问写法 vm._data.title -> vm.title / vm._data.title -> this.title
/**
 * 
 * @param {*} vm 实例
 * @param {String} target '_data'
 * @param {*} key 键名
 */
function proxyData(vm, target, key) {
  // console.log(target); _data
  Object.defineProperty(vm, key, {
    get() {
      //vm._data.title -> vm.title
      return vm[target][key];
    },
    set(newValue) {
      vm[target][key] = newValue;
    }
  });
}

export {
  initState
}